/**
 * Copyright (C), 2022-2025, www.bosssof.com.cn
 * @FileName UserService.java
 * @Author hantianbing
 * @Date 2022-12-9  21:35
 * @Description 该文件为具体的用户管理界面的对应的控制器类
 * History:
 * <author> hantianbing
 * <time> 2022-12-29 21:35
 * <version> 1.0.0
 * <desc> 该文件为具体的用户管理界面的对应的服务类
 */
package com.sd365.permission.centre.service;


import com.sd365.permission.centre.entity.Department;
import com.sd365.permission.centre.entity.Position;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.entity.User;
import com.sd365.permission.centre.pojo.dto.UserDTO;
import com.sd365.permission.centre.pojo.query.UserQuery;

import com.sd365.permission.centre.pojo.vo.UserVO;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;

/***
 * @Description userService接口
 * @Date 2022/12/29 13:50
 * @Author hantianbing
 **/
public interface UserService {
    /**
     * 定义版本和状态
     */
    byte INITIALIZE_STATUS_VALUE=1;
    long INITIALIZE_VERSION_VALUE=1;

    /***
     * @Description 添加用户
     * @param userDTO  用户信息 ，code， 名字， 性别不能为空
     * @return java.lang.Boolean
     * @Date 2022/12/26 11:55
     * @Author hantianbing
     **/
    @Transactional
    Boolean add(@RequestBody @Valid UserDTO userDTO);


    /***
     * @Description 移除用户
     * @param id   用户id
     * @param version 用户版本
     * @return java.lang.Boolean
     * @Date 2022/12/26 11:56
     * @Author hantianbing
     **/
    @Transactional
    Boolean remove(Long id, Long version);


    /***
     * @Description 更新用户信息， 通过输入的用户DTO，更改用户
     * @param userDTO 用户信息 ，code， 名字， 性别不能为空
     * @return java.lang.Boolean
     * @Date 2022/12/25 22:06
     * @Author hantianbing
     **/
    @Transactional
    Boolean modify(@Valid UserDTO userDTO);

    /***
     * @Description 分配用户角色
     * @param userDTOS  用户角色信息 ，code， 名字， 性别不能为空
     * @return java.lang.Boolean
     * @Date 2022/12/26 13:56
     * @Author hantianbing
     **/
    @Transactional
    Boolean modifyWithNewRole(UserDTO[] userDTOS);

    /***
     * @Description 通用查询， 支持模糊查询一些字段
     * @param userQuery  要查询的用户的部分信息
     * @return java.util.List<com.sd365.permission.centre.pojo.vo.UserVO>
     * @Date 2022/12/29 13:51
     * @Author hantianbing
     **/
    List<UserVO> commonQuery(UserQuery userQuery);

    /***
     * @Description 通过用户的id查询出用户
     * @param id  用户ID
     * @return com.sd365.permission.centre.pojo.vo.UserVO
     * @Date 2022/12/29 13:51
     * @Author hantianbing
     **/
    UserVO queryUserById(Long id);

    /***
     * @Description 查询全部用户
     * @return java.util.List<com.sd365.permission.centre.entity.Role>
     * @Date 2022/12/29 13:51
     * @Author hantianbing
     **/
    List<Role> queryAllRole();

    /***
     * @Description 查询全部的部门信息
     * @return java.util.List<com.sd365.permission.centre.entity.Department>
     * @Date 2022/12/29 13:51
     * @Author hantianbing
     **/
    List<Department> queryAllDepartment();

    /***
     * @Description 查询全部的position
     * @return java.util.List<com.sd365.permission.centre.entity.Position>
     * @Date 2022/12/29 13:52
     * @Author hantianbing
     **/
    List<Position> queryAllPosition();

    /***
     * @Description 批量更新
     * @param userDTOS  用户更新信息 ，code， 名字， 性别不能为空
     * @return java.lang.Boolean
     * @Date 2022/12/29 13:52
     * @Author hantianbing
     **/
    @Transactional
    Boolean batchUpdate(UserDTO[] userDTOS);


    /***
     * @Description 批量删除用户
     * @param userDTOS  要删除的用户的信息 ，code， 名字， 性别不能为空
     * @return java.lang.Boolean
     * @Date 2022/12/29 13:53
     * @Author hantianbing
     **/
    @Transactional
    Boolean batchDelete(UserDTO[] userDTOS);


    /***
     * @Description 控制密码md5加密
     * @return java.lang.Boolean
     * @Date 2022/12/29 13:57
     * @Author hantianbing
     **/
    Boolean firstStartMd5();

    /***
     * @Description 更新密码
     * @return java.lang.Boolean
     * @Date 2022/12/25 21:48
     * @Author hantianbing
     **/
    Boolean updatePassword(UserDTO userDTO);

    
    /***
     * @Description todo 根据用户code查询用户
     * @param code  用户的code
     * @return com.sd365.permission.centre.entity.User
     * @Date 2022/12/29 14:08
     * @Author hantianbing
     **/
    User getUser(String code );
}
